package com.example.websocket.controller;

import com.example.websocket.model.ChatMessage;
import com.example.websocket.service.MessageService;
import lombok.RequiredArgsConstructor;
import org.springframework.messaging.handler.annotation.DestinationVariable;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.stereotype.Controller;

/**
 * 聊天控制器，用于处理聊天消息的接收和发送。
 */
@Controller
@RequiredArgsConstructor
public class ChatController {

    private final SimpMessagingTemplate messagingTemplate;

    private final MessageService messageService;

    // 特别注意： topic 用于群聊消息的接收；queue 用于私聊消息的接收。

    // 应用可以发送针对特定用户的消息，参考 https://docs.springjava.cn/spring-framework/reference/web/websocket/stomp/user-destination.html
    // 关于 @SendTo 和 @SendToUser 的区别 https://springdoc.cn/spring/web.html#websocket-stomp-user-destination
    // 私聊消息的发送，目的地带有 /queue
    @MessageMapping("/chat.private/{recipientId}")      // 类似于HTTP中的@RequestMapping，它用来映射特定的目的地（destination）到控制器的方法上。
    @SendToUser(destinations="/queue/errors", broadcast=false)
    public void privateChat(@DestinationVariable String recipientId, @Payload ChatMessage message) {
        // 发送新消息时保存到数据库
        // TODO 将消息保存到 数据库
        messageService.saveMessage(message);

        // 确保消息只发给指定的接收者
        messagingTemplate.convertAndSendToUser(recipientId, "/queue/messages", message);
    }

    // 群聊消息的发送, 目的地带有 /topic
    @MessageMapping("/group.{groupId}/sendMessage")
    // @SendTo("/topic/group/{groupId}")
    @SendToUser(destinations="/topic/group/{groupId}")
    public ChatMessage groupChat(@Payload ChatMessage message, @DestinationVariable String groupId) {
        // 发送新消息时保存到数据库

        // 你可以在这里添加业务逻辑，比如验证用户是否属于该群聊
        return message;
    }

    // 用户第一次被添加到群聊时，发送消息给所有群聊成员
    @MessageMapping("/chat.addUser")
    @SendTo("/topic/messages")
    public ChatMessage addUser(@Payload ChatMessage chatMessage) {
        // 可以在这里添加用户加入逻辑
        return chatMessage;
    }
}